#ifndef __SET_GET_H__
#define __SET_GET_H__

#include "repeat.h"

// #define var(var_name, var_type)                         \
//   private:                                              \
//     var_type var_name##_;                               \
//                                                         \
//   public:                                               \
//     auto var_name() -> var_type { return var_name##_; } \
//     void set_##var_name(var_type new_##var_name) { var_name##_ = new_##var_name; }

#define DECL_WITH_SET_GET(var, type)           \
  private:                                     \
    type var##_;                               \
                                               \
  public:                                      \
    const type& var() const { return var##_; } \
    type&       var##_ref() { return var##_; } \
    void        set_##var(type new_var) { var##_ = new_var; }

#define DECL_WITH_SET_GET_MODIFIER(modifier, var, type) \
    modifier:                                           \
    type var##_;                                        \
                                                        \
  public:                                               \
    const type& var() const { return var##_; }          \
    type&       var##_ref() { return var##_; }          \
    void        set_##var(type new_var) { var##_ = new_var; }

#endif // __SET_GET_H__